#====================================================================== # # Wireless simulation, a simulation of a broadcast protocol # for vehicular ad hoc networks. # # Nathan Balon # University of Michigan - Dearborn # CIS 695 # #======================================================================== #====================================================================== # Options #====================================================================== set opt(chan) Channel/WirelessChannel ;# channel type set opt(prop) Propagation/TwoRayGround ;# radio-propagation model #set opt(prop) Propagation/Shadowing set opt(ant) Antenna/OmniAntenna ;# antenna type set opt(ll) LL ;# link layer set opt(ifq) Queue/DropTail/PriQueue ;# interface queue set opt(ifqlen) 50 ;# max packet in ifq set opt(netif) Phy/WirelessPhy ;# network interface type set opt(mac) Mac/802_11 ;# mac type set opt(rp) DumbAgent ;# routing protocol set opt(nn) 50 ;# number of mobile nodes set opt(pkt_size) 250 ;# size of broadcast message set opt(cp) traffic.tcl ;# connection pattern set opt(tr) trace.tr ;# trace file set opt(nam_tr) "" ;# name trace file set opt(seed) 0.0 ;# seed the random number generator set opt(stop) 65.0 ;# time to end simulation set opt(x) 1000 ;# x size for topology set opt(y) 1000 ;# y size for topology set opt(lm) ON ;# log movement set opt(at) ON ;# agent trace set opt(rt) OFF ;# routing trace set opt(mact) ON ;# mac trace set opt(movt) ON ;# movement trace set opt(cw) 15 Mac/802_11 set CWMax_ 1023 Mac/802_11 set SlotTime_ 0.000013 ;# 20us Mac/802_11 set SIFS_ 0.000032 ;# 10us Mac/802_11 set PreambleLength_ 32 ;# 144 bit Mac/802_11 set PLCPHeaderLength_ 40 ;# 48 bits Mac/802_11 set PLCPDataRate_ 6.0e6 ;# 1Mbps Mac/802_11 set dataRate_ 6.0e6 Mac/802_11 set basicRate_ 6.0e6 Mac/802_11 set RTSThreshold_ 3000 ;# bytes Mac/802_11 set ShortRetryLimit_ 7 ;# retransmittions Mac/802_11 set LongRetryLimit_ 4 ;# retransmissions Phy/WirelessPhy set CPThresh_ 10.0 Phy/WirelessPhy set CSThresh_ 2.5118864e-13 ;# -96 dBm Phy/WirelessPhy set RXThresh_ 1.0e-12 ;# -90 dBm Phy/WirelessPhy set bandwidth_ 6.0e6 Phy/WirelessPhy set Pt_ 0.0003754 Phy/WirelessPhy set freq_ 5.9e+9 Phy/WirelessPhy set L_ 1.0 #Propagation/Shadowing set pathlossExp_ 2.7 #Propagation/Shadowing set std_db_ 4.0 #Propagation/Shadowing set seed_ 0 #Propagation/Shadowing set dist0_ 1.0 # Unity gain, omni-directional antennas # Set up the antennas to be centered in the node and 1.5 meters above it Antenna/OmniAntenna set X_ 0 Antenna/OmniAntenna set Y_ 0 Antenna/OmniAntenna set Z_ 1.5 Antenna/OmniAntenna set Gt_ 4.0 Antenna/OmniAntenna set Gr_ 4.0 #=========================================================================== set BROADCAST_ADDR -1 ;# broadcast address set MESSAGE_PORT 42 ;# periodic message port set WARNING_PORT 33 ;# warning message set EMER_PORT 21 ;# port to listen for emergency messages Class Agent/MessagePassing/PeriodicBroadcast -superclass Agent/MessagePassing Agent/MessagePassing/PeriodicBroadcast instproc recv {source sport size data} { # This empty function is needed so receive works. } Agent/MessagePassing/PeriodicBroadcast instproc send_message {} { $self instvar node_ global ns_ MESSAGE_PORT BROADCAST_ADDR opt # puts "[$node_ node-addr] sending message" # send the broadcast message $self sendto $opt(pkt_size) 0 $BROADCAST_ADDR $MESSAGE_PORT } # perform clean up at the end of the program proc finish {} { global ns_ tracefd namtracefd opt $ns_ flush-trace close $tracefd if {$opt(nam_tr) != ""} { close $namtracefd } $ns_ halt exit 0 } # set the options from the command line arguments proc getopt {argc argv} { global opt lappend optlist cp nn seed sc stop tr x y bc_size nam_tr cw for {set i 0} {$i < $argc} {incr i} { set arg [lindex $argv $i] if {[string range $arg 0 0] != "-"} continue set name [string range $arg 1 end] set opt($name) [lindex $argv [expr $i+1]] } } # log the movement of a node every 0.1 seconds proc log-movement {} { global logtimer ns_ ns set ns $ns_ source ../tcl/mobility/timer.tcl Class LogTimer -superclass Timer LogTimer instproc timeout {} { global opt node_; for {set i 0} {$i < $opt(nn)} {incr i} { $node_($i) log-movement } $self sched 0.1 } set logtimer [new LogTimer] $logtimer sched 0.1 } #get command line arguments getopt $argc $argv Mac/802_11 set CWMin_ $opt(cw) puts "x: $opt(x), y: $opt(y)" puts "CW: $opt(cw)" if {$opt(seed) > 0} { puts "Seeding Random number generator with $opt(seed)\n" ns-random $opt(seed) } # create a new simulator set ns_ [new Simulator] # set up the traces set tracefd [open $opt(tr) w] $ns_ trace-all $tracefd # set the topology set topo [new Topography] $topo load_flatgrid $opt(x) $opt(y) set god_ [ create-god $opt(nn) ] set chan_ [new Channel/WirelessChannel] # Set up the nam trace if desired. if {$opt(nam_tr) != ""} { set namtracefd [open $opt(nam_tr) w] $ns_ namtrace-all-wireless $namtracefd $opt(x) $opt(y) } # configure the nodes of the simulation $ns_ node-config -adhocRouting $opt(rp) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propInstance [new $opt(prop)] \ -phyType $opt(netif) \ -topoInstance $topo \ -channel $chan_ \ -agentTrace $opt(at) \ -routerTrace $opt(rt) \ -macTrace $opt(mact) \ -movementTrace $opt(movt) set y 0 set x 0 # Create the mobile nodes for the simulation. for {set i 0} {$i < $opt(nn)} {incr i} { set node_($i) [$ns_ node] $ns_ initial_node_pos $node_($i) 10 } # Source the mobility scenario file. source $opt(sc) # Attach a new Agent/MessagePassing/PeriodicBroadcast to each node on port $MESSAGE_PORT for {set i 0} {$i < $opt(nn)} {incr i} { set bc_agent($i) [new Agent/MessagePassing/PeriodicBroadcast] $node_($i) attach $bc_agent($i) $MESSAGE_PORT } # log movement if { $opt(lm) == "ON" } { puts "Logging movement..." log-movement } # Source the file that contains the broadcast traffic. source $opt(cp) $ns_ at $opt(stop) "finish" # Add to the trace simulation parameters. puts $tracefd "M 0.0 nn $opt(nn) x $opt(x) y $opt(y) rp $opt(rp)" #puts $tracefd "M 0.0 cp $opt(cp) seed $opt(seed)" puts $tracefd "M 0.0 prop $opt(prop) ant $opt(ant)" puts "Starting Simulation..." $ns_ run